/*
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */

package org.geohunter.activity.map;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

import org.geohunter.activity.map.DensityOverlayDelegate;

import android.graphics.Canvas;
import android.graphics.Point;

public class DensityOverlay extends Overlay {
    // Create delegate because it's not possible to test classes that extend
    // Android classes.

    private final DensityOverlayDelegate mDelegate;

    public DensityOverlay(DensityOverlayDelegate densityOverlayDelegate) {
        mDelegate = densityOverlayDelegate;
    }

    private Point mScreenTopLeft = new Point();
    private Point mScreenBottomRight = new Point();
    
    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);
        if (shadow)
            return; // No shadow layer
        final Projection projection = mapView.getProjection();
        final GeoPoint newGeoTopLeft = projection.fromPixels(0, 0);
        final GeoPoint newGeoBottomRight = projection.fromPixels(mapView.getWidth(), mapView
                .getHeight());

        projection.toPixels(newGeoTopLeft, mScreenTopLeft);
        projection.toPixels(newGeoBottomRight, mScreenBottomRight);
        mDelegate.draw(canvas, 
                newGeoTopLeft.getLatitudeE6(), newGeoTopLeft.getLongitudeE6(),
                newGeoBottomRight.getLatitudeE6(), newGeoBottomRight.getLongitudeE6(),
                mScreenTopLeft, mScreenBottomRight);
    }
}
